/**
 * 文件相关的方法
 */

const fs = require('fs');
const path = require('path');
// 目标目录
const target = 'C:\\fileDir';

/**
 * 根据树结构生成对应的目录
 * @param {string} targetDir - 目标目录路径
 * @param {Array} tree - 树结构数组
 */
async function createByTree (tree, targetDir = target) {
	let cloneTree = JSON.parse(JSON.stringify(tree));

	async function createFileDir (tree, targetDir) {
		// 遍历树结构
		for (let i = 0; i < tree.length; i++) {
			let node = tree[i]

			// tree.forEach(async (node, index) => {
			const currentPath = path.join(targetDir, node.name); // 当前节点路径
			node.path = currentPath;
			// 如果当前节点有子节点，说明是目录
			if (currentPath) {
				if (!fs.existsSync(currentPath)) {
					// 如果目录不存在，则创建目录
					try {
						fs.mkdirSync(currentPath, { recursive: true });
					} catch (e) {
						console.error(e);
					}
				}
				if (node.children && node.children.length > 0) {
					// 递归创建子目录
					await createFileDir(node.children, currentPath);
				}
			}
		}
	}
	await createFileDir(cloneTree, targetDir);
	return flattenTree(cloneTree)
}

function flattenTree (tree) {
	return tree.reduce((acc, node) => {
		acc.push(node); // 添加当前节点的值
		if (node.children) {
			acc = acc.concat(flattenTree(node.children)); // 递归处理子节点
		}
		return acc;
	}, []);
}

/**
 * 流式写入文件
 * @param {ReadableStream} fileStream - 文件的二进制流
 * @param {string} directory - 保存文件的目录
 * @param {string} fileName - 保存的文件名
 * @returns {Promise<string>} - 返回保存文件的完整路径
 */
function saveFileStreamToLocal (fileStream, directory, fileName) {
	return new Promise(async (resolve, reject) => {
		// 确保目录存在，如果不存在则创建
		if (!fs.existsSync(directory)) {
			fs.mkdirSync(directory, { recursive: true });
		}

		// 拼接文件的完整路径
		const filePath = path.join(directory, fileName);

		const buffer = Buffer.from(fileStream);
		// 将 Buffer 写入文件
		fs.writeFile(filePath, buffer, (err) => {
			if (err) {
				reject(err);
			} else {
				resolve(filePath)
			}
		});
	});
}

module.exports = {
	createByTree, target, saveFileStreamToLocal, flattenTree
}
